﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Entidades.Seguridad;
using Modelo.Seguridad;
using MvcPaging;

namespace VistaOnlineR1._1.Controllers.Seguridad
{
    [Authorize(Roles = "Administracion")]
    public class PerfilesController : BaseController
    {
        #region campos
        CatalogoPerfiles _catalogoPerfiles;
        CatalogoFormularios _catalogoFormularios;
        CatalogoGrupos _catalogoGrupo;
        CatalogoPermisos _catalogoPermisos;
        #endregion

        #region Constructors
        public PerfilesController()
            : this(new CatalogoPerfiles(), new CatalogoFormularios(), new CatalogoGrupos(), new CatalogoPermisos())
        {
        }

        public PerfilesController(CatalogoPerfiles catalogoPerfiles, CatalogoFormularios catalogoFormularios, CatalogoGrupos catalogoGrupo, CatalogoPermisos catalogoPermisos)
        {
            _catalogoPerfiles = catalogoPerfiles;
            _catalogoFormularios = catalogoFormularios;
            _catalogoGrupo = catalogoGrupo;
            _catalogoPermisos = catalogoPermisos;
        }
        #endregion

        private const int DefaultPageSize = 10;

        public ViewResultBase Search(string Grupo, string Formulario, string Permiso, int? page)
        {

            // Agregar varios filtros
            List<Perfil> listPerfil = RecuperarPerfil();

            ViewBag.PermisoDelete = listPerfil.Any(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCrear = listPerfil.Any(per => per.Permiso.Nombre == "Create");
            ViewBag.PermisoEditar = listPerfil.Any(per => per.Permiso.Nombre == "Edit");

            List<Perfil> perfils =
                _catalogoPerfiles.ListarPerfiles(Grupo, Formulario, Permiso).ToList();
            int currentPageIndex = page.HasValue ? page.Value - 1 : 0;

            #region  Creamos el combo de grupos
            List<SelectListItem> grup = new List<SelectListItem>();
            List<Grupo> grupos = _catalogoGrupo.ListarGrupos().ToList();

            foreach (var grupo in grupos)
            {
                grup.Add(new SelectListItem { Text = grupo.IdGrupo, Value = grupo.IdGrupo });
            }

            grup.Add(new SelectListItem { Text = "TODOS", Value = "TODOS" });


            ViewBag.IdGrupo = new SelectList(grup, "Value", "Text", selectedValue: Grupo);
            #endregion

            #region  Creamos el combo de formularios
            List<SelectListItem> form = new List<SelectListItem>();
            List<Formulario> formularios = _catalogoFormularios.ListarFormularios().ToList();

            foreach (var formu in formularios)
            {
                form.Add(new SelectListItem { Text = formu.Nombre, Value = formu.IdFormulario });
            }

            form.Add(new SelectListItem { Text = "TODOS", Value = "TODOS" });


            ViewBag.IdFormulario = new SelectList(form, "Value", "Text", selectedValue: Formulario);
            #endregion

            #region  Creamos el combo de permisos
            List<SelectListItem> perm = new List<SelectListItem>();
            List<Permiso> permisos = _catalogoPermisos.ListarPermisos().ToList();

            foreach (var permiso in permisos)
            {
                perm.Add(new SelectListItem { Text = permiso.Nombre, Value = permiso.IdPermiso });
            }

            perm.Add(new SelectListItem { Text = "TODOS", Value = "TODOS" });


            ViewBag.IdPermiso = new SelectList(perm, "Value", "Text", selectedValue: Permiso);
            #endregion


            if (Request.IsAjaxRequest())
                return PartialView("Index", perfils.OrderBy(c => c.Grupo.IdGrupo).ToList().ToPagedList(currentPageIndex, DefaultPageSize));
            else
                return View("Index", perfils.OrderBy(c => c.Grupo.IdGrupo).ToList().ToPagedList(currentPageIndex, DefaultPageSize));
        }
        
        public ViewResult Index(int? page)
        {

            List<Perfil> listPerfil = RecuperarPerfil();

            ViewBag.PermisoDelete = listPerfil.Any(per => per.Permiso.Nombre == "Delete");
            ViewBag.PermisoCrear = listPerfil.Any(per => per.Permiso.Nombre == "Create");



            #region  Creamos el combo de grupos
            List<SelectListItem> grup = new List<SelectListItem>();
            List<Grupo> grupos = _catalogoGrupo.ListarGrupos().ToList();

            foreach (var grupo in grupos)
            {
                grup.Add(new SelectListItem { Text = grupo.IdGrupo, Value = grupo.IdGrupo });
            }

            grup.Add(new SelectListItem { Text = "TODOS", Value = "TODOS" });


            ViewBag.IdGrupo = new SelectList(grup, "Value", "Text", selectedValue: "TODOS");
            #endregion

            #region  Creamos el combo de formularios
            List<SelectListItem> form = new List<SelectListItem>();
            List<Formulario> formularios = _catalogoFormularios.ListarFormularios().ToList();

            foreach (var formu in formularios)
            {
                form.Add(new SelectListItem { Text = formu.Nombre, Value = formu.IdFormulario });
            }

            form.Add(new SelectListItem { Text = "TODOS", Value = "TODOS" });


            ViewBag.IdFormulario = new SelectList(form, "Value", "Text", selectedValue: "TODOS");
            #endregion


            #region  Creamos el combo de permisos
            List<SelectListItem> perm = new List<SelectListItem>();
            List<Permiso> permisos = _catalogoPermisos.ListarPermisos().ToList();

            foreach (var permiso in permisos)
            {
                perm.Add(new SelectListItem { Text = permiso.Nombre, Value = permiso.IdPermiso });
            }

            perm.Add(new SelectListItem { Text = "TODOS", Value = "TODOS" });


            ViewBag.IdPermiso = new SelectList(perm, "Value", "Text", selectedValue: "TODOS");
            #endregion



            int currentPageIndex = page.HasValue ? page.Value - 1 : 0;

            List<Perfil> perfils =
                _catalogoPerfiles.ListarPerfiles().ToList();

            return View(perfils.OrderBy(
                c => c.Grupo.IdGrupo).ToList().ToPagedList(currentPageIndex, DefaultPageSize));
        }

        public ActionResult Create2()
        {

            #region  Creamos el combo de grupos
            List<SelectListItem> grup = new List<SelectListItem>();
            List<Grupo> grupos = _catalogoGrupo.ListarGrupos().ToList();

            foreach (var grupo in grupos)
            {
                grup.Add(new SelectListItem {Text = grupo.IdGrupo, Value = grupo.IdGrupo});
            }

            ViewBag.IdGrupo = new SelectList(grup, "Value", "Text");
            #endregion

            #region Creamos el campo de formularios
            List<SelectListItem> forms = new List<SelectListItem>();
            List<Formulario> formularios =
                _catalogoFormularios.ListarFormularios().ToList();

            foreach (var form in formularios)
            {
                forms.Add(new SelectListItem { Text = form.Descripcion, Value = form.IdFormulario });
            }

            ViewBag.IdFormulario = new SelectList(forms, "Value", "Text");
            #endregion


            return View();
        }


        [HttpPost]
        public ActionResult Create2(string Grupo, string Formulario, string Permisos)
        {
            if (Grupo == null)
            {
                ModelState.AddModelError("CustomError", "Grupo es requerido.");
            }
            if (Formulario == null)
            {
                ModelState.AddModelError("CustomError", "Formulario es requerido.");
            }

            if (Permisos == null)
            {
                ModelState.AddModelError("CustomError", "Permiso es requerido");
            }

            if (ModelState.IsValid)
            {
                Perfil oPerfil = new Perfil();

                oPerfil.Grupo = _catalogoGrupo.BuscarGrupo(Grupo);
                oPerfil.Formulario = _catalogoFormularios.BuscarFormulario(
                        Formulario);
                oPerfil.Permiso =_catalogoPermisos.BuscarPermiso(Permisos);
                _catalogoPerfiles.AgregarPerfil(oPerfil);

                return RedirectToAction("Index", "Perfiles");
            }


            #region  Creamos el combo de grupos
            List<SelectListItem> grup = new List<SelectListItem>();
            List<Grupo> grupos = _catalogoGrupo.ListarGrupos().ToList();

            foreach (var grupo in grupos)
            {
                grup.Add(new SelectListItem { Text = grupo.IdGrupo, Value = grupo.IdGrupo });
            }

            ViewBag.IdGrupo = new SelectList(grup, "Value", "Text");
            #endregion

            #region Creamos el campo de formularios
            List<SelectListItem> forms = new List<SelectListItem>();
            List<Formulario> formularios = _catalogoFormularios.ListarFormularios().ToList();

            foreach (var form in formularios)
            {
                forms.Add(new SelectListItem { Text = form.Descripcion, Value = form.IdFormulario });
            }

            ViewBag.IdFormulario = new SelectList(forms, "Value", "Text");
            #endregion

            return View();
        }

        public JsonResult PermisosList(string grupo, string formu)
        {

            Grupo oGrupo = _catalogoGrupo.BuscarGrupo(grupo);
            Formulario oFormulario = _catalogoFormularios.BuscarFormulario(formu);
            Permiso oPermiso = new Permiso();
            oPermiso.Nombre = "TODOS";

            /*List<Permiso> permisos =
                Controladora.Seguridad.CUGestionarpermisos.ObtenerInstancia().ConsultarPermisos().ToList();*/

            List<Permiso> permisos = oFormulario.Permisos.ToList();

            List<Perfil> perfiles = _catalogoPerfiles.ListarPerfiles(oGrupo, oFormulario,oPermiso).ToList();

            List<Permiso> permisosperfiles = new List<Permiso>();

            foreach (var permisosperfile in perfiles)
            {
                Permiso oPermiso2 = new Permiso();
                oPermiso2 = _catalogoPermisos.BuscarPermiso(permisosperfile.Permiso.IdPermiso);
                permisosperfiles.Add(oPermiso2);
            }

            var y = from e in permisos select e.IdPermiso;
            var z = from f in permisosperfiles select f.IdPermiso;
            var x = y.Except(z).ToList();

            List<SelectListItem> perm = new List<SelectListItem>();
            List<Permiso> listFinal = new List<Permiso>();

            foreach (var item in x)
            {
                Permiso oPermisoBis = new Permiso();
                oPermisoBis = _catalogoPermisos.BuscarPermiso(item);
                listFinal.Add(oPermisoBis);
            }

            foreach (var permiso in listFinal)
            {
                perm.Add(new SelectListItem { Text = permiso.Nombre, Value = permiso.IdPermiso });
            }

            return Json(new SelectList(perm, "Value", "Text"), JsonRequestBehavior.AllowGet);

        }


        public ActionResult Create()
        {
            ViewBag.IdGrupo = new SelectList(_catalogoGrupo.ListarGrupos().ToList(), "IdGrupo", "IdGrupo");
            ViewBag.IdFormulario = new SelectList(_catalogoFormularios.ListarFormularios().ToList(), "IdFormulario", "Nombre");
            ViewBag.IdPermiso = new SelectList(_catalogoPermisos.ListarPermisos().ToList(), "IdPermiso", "Nombre");
            if (Request.IsAjaxRequest())
            {
                return PartialView("Create");
            }
            else
            {
                return View("Create");
            }
        } 

       
        [HttpPost]
        public ActionResult Create(Grupo oGrupo,Formulario oFormulario,Permiso oPermiso)
        {
            try
            {
                // TODO: Add insert logic here
                Perfil oPerfil = new Perfil();

                oPerfil.Grupo = _catalogoGrupo.BuscarGrupo(oGrupo.IdGrupo);
                oPerfil.Formulario = _catalogoFormularios.BuscarFormulario(oFormulario.IdFormulario);
                oPerfil.Permiso = _catalogoPermisos.BuscarPermiso(oPermiso.IdPermiso);
                _catalogoPerfiles.AgregarPerfil(oPerfil);

                return RedirectToAction("Index","Perfiles");

            }
            catch
            {
                return View();
            }
        }
        
        public ActionResult Delete()
        {
            return View();
        }

        [HttpPost]
        public ActionResult Delete(string idgrupo, string idform, string idpermiso)
        {
            try
            {
                Grupo oGrupo = _catalogoGrupo.BuscarGrupo(idgrupo);
                Formulario oFormulario = _catalogoFormularios.BuscarFormulario(idform);
                Permiso oPermiso = _catalogoPermisos.BuscarPermiso(idpermiso);

                Perfil oPerfil = _catalogoPerfiles.BuscarPerfil(oGrupo, oFormulario, oPermiso);

                _catalogoPerfiles.EliminarPerfil(oPerfil);
                return RedirectToAction("Index");
            }
            catch
            {
                return View();
            }
        }

        #region Funciones Varias



        #endregion

    }
}
